package org.jeecg.cmbCloudDirectLink.utils;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.cmbCloudDirectLink.constant.CMBConstant;
import org.jeecg.cmbCloudDirectLink.model.PullAccountModel;
import org.jeecg.cmbCloudDirectLink.model.PushAccountModel;
import org.jeecg.common.api.dto.BankSetDTO;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.FillRuleUtil;
import org.jeecg.common.util.oConvertUtils;

import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
 * 招行银企直联相关接口
 */
@Slf4j
public class CMBApi {

    public static void main(String[] args) throws Exception {
        BankSetDTO bankSetDTO = new BankSetDTO();
//        bankSetDTO.setZsyhUid("N002462434");
//        bankSetDTO.setZsyhBankSm2PubKey("BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=");
//        bankSetDTO.setZsyhUserSm2PriKey("NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=");
//        bankSetDTO.setZsyhUserSm4Key("VuAzSWQhsoNqzn0K");

        // 用户编号
        bankSetDTO.setZsyhUid("U045194117");
        // 银行SM公钥
        bankSetDTO.setZsyhBankSm2PubKey("BEynMEZOjNpwZIiD9jXtZSGr3Ecpwn7r+m+wtafXHb6VIZTnugfuxhcKASq3hX+KX9JlHODDl9/RDKQv4XLOFak=");
        // 用户SM私钥
        bankSetDTO.setZsyhUserSm2PriKey("LvxRBwwmR5HrfUvSPIPAnTUrNxIwRKZap+y/MFvS/QA=");
        // 对称密钥（SM4密钥）
        bankSetDTO.setZsyhUserSm4Key("cFpy18Q0Cp6UCoGM");
        // 主账户
        String mainAccount = "571923135210001";
        // 户名
        String accountName = "河南云台智算科技有限公司";
        // 记账子单元编号
        String subUnit = "773628";

//        System.out.println("新增记账子单元：" + addBookkeepingSubUnit(mainAccount,
//                GENKey.genRandomString(new Random(), "0123456789", 6),"杭州云税匠企业管理咨询有限公司",bankSetDTO));

//        System.out.println("查询记账子单元：" + queryBookkeepingSubUnit(mainAccount,subUnit ,"", bankSetDTO));

//        System.out.println("关闭记账子单元：" + closeBookkeepingSubUnit("755915677910106","6891362109" ));


//        System.out.println("设置记账子单元关联付款方信息：" + setSubUnitRelatedPayer(mainAccount,"57",subUnit,"571923131810001","杭州云税匠企业管理咨询有限公司",bankSetDTO ));
//        System.out.println("查询记账子单元关联付款方信息：" + querySubUnitRelatedPayer(mainAccount,"57", subUnit, bankSetDTO ));
//        System.out.println("删除记账子单元关联付款方信息：" + delSubUnitRelatedPayer(mainAccount,"57",subUnit,"571923131810001","杭州云税匠企业管理咨询有限公司",bankSetDTO ));


//        System.out.println("查询记账子单元当天交易：" + querySubUnitDayTransaction(mainAccount, subUnit,"", bankSetDTO));
//        System.out.println("查询账户下所有记账子单元当天交易：" + querySubUnitDayTransaction(mainAccount, "", "", bankSetDTO));
//        System.out.println("查询记账子单元历史交易：" + querySubUnitHistoryTransaction(mainAccount, subUnit, "20250620","20250622","", bankSetDTO));

//        System.out.println("查询记账子单元余额：" + querySubUnitBalance(mainAccount, subUnit, bankSetDTO));

//        System.out.println("记账子单元内部转账：" + doInternalTransfer(mainAccount, subUnit,"000000", "2","服务费", bankSetDTO));

//        System.out.println("查询账户详细信息：" + queryAccountInfo(mainAccount, "75", bankSetDTO));
//        System.out.println("查询账户交易记录：" + queryAccountTransaction(mainAccount, "75", DateUtils.sdf8.format(new Date()),"", bankSetDTO));

        //付款方
        PushAccountModel pushAccountModel = new PushAccountModel();
        pushAccountModel.setAccount(mainAccount);
        pushAccountModel.setName("杭州云税匠企业管理咨询有限公司");
        pushAccountModel.setSubUnit(subUnit);
        pushAccountModel.setTotalAmount("2");
        pushAccountModel.setTotalNum("1");
        pushAccountModel.setOrderNo(FillRuleUtil.OrderNumberRule("XF",""));
        pushAccountModel.setExpectDate(DateUtils.sdf8.format(new Date()));
        //收款方
        List<PullAccountModel> pullList = new ArrayList<>();
        PullAccountModel pullAccountModel1 = new PullAccountModel();
        pullAccountModel1.setBankCard("6217004180007789795");
        pullAccountModel1.setName("张星");
        pullAccountModel1.setMoney(2.00);
        pullAccountModel1.setCode("00000001");
        pullList.add(pullAccountModel1);
//        PullAccountModel pullAccountModel2 = new PullAccountModel();
//        pullAccountModel2.setBankCard("6214837811201973");
//        pullAccountModel2.setName("鲁贺滢");
//        pullAccountModel2.setMoney(45.62);
//        pullAccountModel2.setCode("00000002");
//        pullList.add(pullAccountModel2);
//        System.out.println("代发经办：" + doIssuedOnBehalf(pushAccountModel,pullList, bankSetDTO));
        // 代发经办：流程实例号：reqnbr：4784572693 ，业务参考号：XF2025062318581534791 ， refnbr：K1253500000096C
//        System.out.println("代发批次与明细查询：" + queryBatchAndDetail("XF2025062318581534791", bankSetDTO));

//        System.out.println("单笔回单查询：" + querySingleReceipt("755915677910106",DateUtils.getTodayDate(),"C0546JF000078EZ"));
//        System.out.println("电子回单异步查询：" + queryElectronicReceiptAsyn("755915677910106",DateUtils.sdf4.format(new Date()),DateUtils.sdf4.format(new Date())));
        //打印任务编号 rtndat：G1ojWIQlt3skrkOmnh6XvIdcqEUIpXJSGok5iK/0OsQ=
//        System.out.println("异步打印结果查询：" + queryPrintResultsAsyn("4F13aKXu69BEonnlmoIrtFcGhk8gh42yo0yUtEclFAw="));


//        System.out.println("企银支付单笔经办：" + doPaymentSingle(mainAccount,subUnit,
//                "571923131810001","杭州云税匠企业管理咨询有限公司","招商银行","",
//                6.00, "手动退款","TK2023011014141521451",bankSetDTO ));

//        System.out.println("企银支付业务查询：" + queryPaymentSingle("TK2023011014141521451", bankSetDTO ));

//        System.out.println("联行号查询：" + queryInterbankNumber("招商银行股份有限公司杭州余杭支行 杭州",bankSetDTO ));
    }

    /**
     * 新增记账子单元（NTDMAADD）
     *
     * @param accnbr 账号
     * @param dmanbr 记账子单元编号
     * @param dmanam 记账子单元名称
     * @return rtnsts 业务处理结果：S：成功，F：失败，I/W：银行处理中
     * @throws Exception
     */
    public static Result<?> addBookkeepingSubUnit(String accnbr, String dmanbr, String dmanam, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "NTDMAADD");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray ntdmaaddx_array = new JsonArray();
        JsonObject ntdmaaddx = new JsonObject();
        ntdmaaddx.addProperty("accnbr", accnbr);//账号
        ntdmaaddx.addProperty("dmanbr", dmanbr);//记账子单元编号,不超过10位。自定义记账子单元编号：非空 系统自动生成记账子单元编号：空
        ntdmaaddx.addProperty("dmanam", dmanam);//记账子单元名称
        ntdmaaddx.addProperty("ovrctl", "N");//空：默认 Y。 Y： 允许透支， N：不允许透支
        ntdmaaddx_array.add(ntdmaaddx);

        //body报文
        JsonObject body = new JsonObject();
        body.add("ntdmaaddx", ntdmaaddx_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("新增记账子单元（NTDMAADD）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "NTDMAADD", bankSetDTO);
            if(result.isSuccess()){
                log.info("新增记账子单元（NTDMAADD）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    JsonObject ntdmabadz1 = object.getAsJsonObject("response").getAsJsonObject("body")
                            .getAsJsonArray("ntdmabadz1").get(0).getAsJsonObject();
                    if(CMBConstant.SUCCESS_CODE.equals(ntdmabadz1.get("errcod").getAsString())
                            && "S".equals(ntdmabadz1.get("rtnsts").getAsString())){
                        return Result.ok("新增成功！",ntdmabadz1.get("dmanbr"));
                    } else {
                        return Result.error(ntdmabadz1.get("errtxt").getAsString());
                    }
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("新增记账子单元（NTDMAADD）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

//    /**
//     * 查询记账子单元信息（NTDMALST）
//     * @param accnbr 账号
//     * @param dmanbr 记账子单元编号，填空表示查询该账号下所有记账子单元信息
//     * @param rsv50z 续传字段，第一次传空，当返回接口有本接口并且该接口的续传字段有值，说明需要续传，取出续传字段放到下次请求报文中继续查询
//     * @return
//     */
//    public static Result<?> queryBookkeepingSubUnit(String accnbr, String dmanbr, String rsv50z, BankSetDTO bankSetDTO) {
//        //请求头报文
//        JsonObject head = new JsonObject();
//        head.addProperty("funcode", "NTDMALST");
//        head.addProperty("userid", bankSetDTO.getZsyhUid());
//        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));
//
//        //接口请求参数
//        JsonArray ntdmalstx_array = new JsonArray();
//        JsonObject ntdmalstx = new JsonObject();
//        ntdmalstx.addProperty("accnbr", accnbr);
//        ntdmalstx.addProperty("dmanbr", dmanbr);
//        ntdmalstx.addProperty("rsv50z", rsv50z);
//        ntdmalstx_array.add(ntdmalstx);
//
//        //body报文
//        JsonObject body = new JsonObject();
//        body.add("ntdmalstx", ntdmalstx_array);
//
//        //请求报文
//        JsonObject req = new JsonObject();
//        req.add("head", head);
//        req.add("body", body);
//
//        //最终请求报文
//        JsonObject obj = new JsonObject();
//        obj.add("request", req);
//        log.info("查询记账子单元信息（NTDMALST）请求报文：{}", obj);
//        try {
//            // 请求发送接收
//            Result<?> result = SMRequest.doProcess(obj, "NTDMALST", bankSetDTO);
//            if(result.isSuccess()){
//                log.info("查询记账子单元信息（NTDMALST）响应报文：{}", result.getResult());
//                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
//                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
//                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
//                    JsonObject ntdmalstz = object.getAsJsonObject("response").getAsJsonObject("body")
//                            .getAsJsonArray("ntdmalstz").get(0).getAsJsonObject();
//                    return Result.ok("查询成功！",ntdmalstz);
//                } else {
//                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
//                }
//            } else {
//                return Result.error(result.getMessage());
//            }
//        }catch (Exception e){
//            log.error("查询记账子单元信息（NTDMALST）失败：{}", e.getMessage());
//            return Result.error("请求失败！");
//        }
//    }

//    /**
//     * 关闭记账子单元（NTDMADLT）
//     * @param accnbr  账号
//     * @param dmanbr 记账子单元编号
//     * @return
//     */
//    public static Result<?> closeBookkeepingSubUnit(String accnbr, String dmanbr, BankSetDTO bankSetDTO) {
//        //请求头报文
//        JsonObject head = new JsonObject();
//        head.addProperty("funcode", "NTDMADLT");
//        head.addProperty("userid", bankSetDTO.getZsyhUid());
//        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));
//
//        //接口请求参数
//        JsonArray ntdmadltx1_array = new JsonArray();
//        JsonObject ntdmadltx1 = new JsonObject();
//        ntdmadltx1.addProperty("accnbr", accnbr);
//        ntdmadltx1_array.add(ntdmadltx1);
//        JsonArray ntdmadltx2_array = new JsonArray();
//        JsonObject ntdmadltx2 = new JsonObject();
//        ntdmadltx2.addProperty("dmanbr", dmanbr);
//        ntdmadltx2_array.add(ntdmadltx2);
//
//        //body报文
//        JsonObject body = new JsonObject();
//        body.add("ntdmadltx1", ntdmadltx1_array);
//        body.add("ntdmadltx2", ntdmadltx2_array);
//
//        //请求报文
//        JsonObject req = new JsonObject();
//        req.add("head", head);
//        req.add("body", body);
//
//        //最终请求报文
//        JsonObject obj = new JsonObject();
//        obj.add("request", req);
//        log.info("关闭记账子单元（NTDMADLT）请求报文：{}", obj);
//        try {
//            // 请求发送接收
//            Result<?> result = SMRequest.doProcess(obj, "NTDMADLT", bankSetDTO);
//            if(result.isSuccess()){
//                log.info("关闭记账子单元（NTDMADLT）响应报文：{}", result.getResult());
//                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
//                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
//                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
//                    JsonObject ntdmadltz = object.getAsJsonObject("response").getAsJsonObject("body")
//                            .getAsJsonArray("ntdmadltz").get(0).getAsJsonObject();
//                    return Result.ok("请求成功！",ntdmadltz);
//                } else {
//                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
//                }
//            } else {
//                return Result.error(result.getMessage());
//            }
//        }catch (Exception e){
//            log.error("关闭记账子单元（NTDMADLT）失败：{}", e.getMessage());
//            return Result.error("请求失败！");
//        }
//    }

    /**
     * 设置记账子单元关联付款方信息（NTDMARLT）
     * @param accnbr 账号
     * @param bbknbr 分行号
     * @param dmanbr 记账子单元编号
     * @param dbtacc 付方账号
     * @param dbtnam 付方户名
     * @param bankSetDTO
     * @return
     */
    public static Result<?> setSubUnitRelatedPayer(String accnbr,String bbknbr, String dmanbr, String dbtacc, String dbtnam, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "NTDMARLT");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray ntbusmody_array = new JsonArray();
        JsonObject ntbusmody = new JsonObject();
        ntbusmody.addProperty("busmod", "C0001"); // 业务模式-交易管家（无审批）
        ntbusmody_array.add(ntbusmody);

        JsonArray ntdmarltx1_array = new JsonArray();
        JsonObject ntdmarltx1 = new JsonObject();
        ntdmarltx1.addProperty("accnbr", accnbr);//账号
        ntdmarltx1.addProperty("bbknbr", bbknbr);//分行号
        ntdmarltx1.addProperty("dmanbr", dmanbr);//记账子单元编号
        ntdmarltx1.addProperty("dbtacc", dbtacc);//付方账号
        ntdmarltx1.addProperty("dbtnam", dbtnam);//付方户名
        ntdmarltx1.addProperty("tlyopr", "R" );//入账方式：Y：非关联收款入账付方指定子单元，N：非关联收款入账默认子单元，R：非关联收款拒绝入账
        ntdmarltx1.addProperty("yurref", "RP" + DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));//业务参考号
        ntdmarltx1_array.add(ntdmarltx1);

        //body报文
        JsonObject body = new JsonObject();
        body.add("ntbusmody", ntbusmody_array);
        body.add("ntdmarltx1", ntdmarltx1_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("设置记账子单元关联付款方信息（NTDMARLT）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "NTDMARLT", bankSetDTO);
            if(result.isSuccess()){
                log.info("设置记账子单元关联付款方信息（NTDMADLT）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    return Result.ok("设置成功！");
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("设置记账子单元关联付款方信息（NTDMARLT）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

    /**
     * 查询记账子单元关联付款方信息（NTDMARLQ）
     * @param accnbr 账号
     * @param bbknbr 分行号
     * @param dmanbr 记账子单元编号
     * @param bankSetDTO
     * @return
     */
    public static Result<?> querySubUnitRelatedPayer(String accnbr,String bbknbr, String dmanbr, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "NTDMARLQ");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray ntdmarlqy1_array = new JsonArray();
        JsonObject ntdmarlqy1 = new JsonObject();
        ntdmarlqy1.addProperty("accnbr", accnbr);//账号
        ntdmarlqy1.addProperty("bbknbr", bbknbr);//分行号
        ntdmarlqy1.addProperty("dmanbr", dmanbr);//记账子单元编号
        ntdmarlqy1_array.add(ntdmarlqy1);

        //body报文
        JsonObject body = new JsonObject();
        body.add("ntdmarlqy1", ntdmarlqy1_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("查询记账子单元关联付款方信息（NTDMARLQ）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "NTDMARLQ", bankSetDTO);
            if(result.isSuccess()){
                log.info("查询记账子单元关联付款方信息（NTDMARLQ）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    JsonArray ntdmarlqz1 = object.getAsJsonObject("response").getAsJsonObject("body").getAsJsonArray("ntdmarlqz1");
                    return Result.ok("查询成功！", ntdmarlqz1);
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("查询记账子单元关联付款方信息（NTDMARLQ）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

    /**
     * 删除记账子单元关联付款方信息（NTDMARLD）
     * @param accnbr 账号
     * @param bbknbr 分行号
     * @param dmanbr 记账子单元编号
     * @param dbtacc 付方账号
     * @param dbtnam 付方户名
     * @param bankSetDTO
     * @return
     */
    public static Result<?> delSubUnitRelatedPayer(String accnbr,String bbknbr, String dmanbr, String dbtacc, String dbtnam, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "NTDMARLD");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray ntbusmody_array = new JsonArray();
        JsonObject ntbusmody = new JsonObject();
        ntbusmody.addProperty("busmod", "C0001");//业务模式
        ntbusmody_array.add(ntbusmody);

        JsonArray ntdmarldx1_array = new JsonArray();
        JsonObject ntdmarldx1 = new JsonObject();
        ntdmarldx1.addProperty("accnbr", accnbr);//账号
        ntdmarldx1.addProperty("bbknbr", bbknbr);//分行号
        ntdmarldx1.addProperty("dmanbr", dmanbr);//记账子单元编号
        ntdmarldx1.addProperty("dbtacc", dbtacc);//付方账号
        ntdmarldx1.addProperty("dbtnam", dbtnam);//付方户名
        ntdmarldx1.addProperty("tlyopr", "R" );//入账方式：Y：非关联收款入账付方指定子单元，N：非关联收款入账默认子单元，R：非关联收款拒绝入账
        ntdmarldx1.addProperty("yurref", "RP" + DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));//业务参考号
        ntdmarldx1_array.add(ntdmarldx1);

        //body报文
        JsonObject body = new JsonObject();
        body.add("ntbusmody", ntbusmody_array);
        body.add("ntdmarldx1", ntdmarldx1_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("删除记账子单元关联付款方信息（NTDMARLD）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "NTDMARLD", bankSetDTO);
            if(result.isSuccess()){
                log.info("删除记账子单元关联付款方信息（NTDMADLT）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    return Result.ok("删除成功！");
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("删除记账子单元关联付款方信息（NTDMARLD）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

    /**
     * 查询记账子单元当天交易（NTDMTLST）
     *   调用频率限制：该接口限制同一个账号间隔10S才能再次发起查询（续传除外）。
     * @param accnbr 账号
     * @param dmanbr 记账子单元编号
     * @param ctnkey 续传字段
     * @return
     * @throws Exception
     */
    public static Result<?> querySubUnitDayTransaction(String accnbr, String dmanbr, String ctnkey, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "NTDMTLST");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray ntdmtlsty_array = new JsonArray();
        JsonObject ntdmtlsty = new JsonObject();
        ntdmtlsty.addProperty("accnbr", accnbr);//账号
        ntdmtlsty.addProperty("dmanbr", dmanbr);//记账子单元编号
        ntdmtlsty.addProperty("ctnkey", ctnkey);//续传字段
        ntdmtlsty_array.add(ntdmtlsty);

        //body报文
        JsonObject body = new JsonObject();
        body.add("ntdmtlsty", ntdmtlsty_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("查询记账子单元当天交易（NTDMTLST）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "NTDMTLST", bankSetDTO);
            if(result.isSuccess()){
                log.info("查询记账子单元当天交易（NTDMTLST）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    return Result.ok("查询成功！",object.getAsJsonObject("response").getAsJsonObject("body").getAsJsonArray("ntdmtlstz"));
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("查询记账子单元当天交易（NTDMTLST）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

    /**
     * 查询记账子单元历史交易（NTDMTHLS）
     * @param accnbr 账号
     * @param dmanbr 记账子单元编号
     * @param begdat 起始日期（格式：20230403），只能查询近 13 个月的历史交易
     * @param enddat 结束日期（格式：20230403），小于当天，大于或等于起始日期，与起始日期相距100天内
     * @param ctnkey 续传字段
     * @param bankSetDTO
     * @return
     */
    public static Result<?> querySubUnitHistoryTransaction(String accnbr, String dmanbr, String begdat, String enddat, String ctnkey, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "NTDMTHLS");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray ntdmthlsy_array = new JsonArray();
        JsonObject ntdmthlsy = new JsonObject();
        ntdmthlsy.addProperty("accnbr", accnbr);//账号
        ntdmthlsy.addProperty("dmanbr", dmanbr);//记账子单元编号
        ntdmthlsy.addProperty("ctnkey", ctnkey);//续传字段
        ntdmthlsy.addProperty("begdat", begdat);//起始日期
        ntdmthlsy.addProperty("enddat", enddat);//结束日期
        ntdmthlsy_array.add(ntdmthlsy);

        //body报文
        JsonObject body = new JsonObject();
        body.add("ntdmthlsy", ntdmthlsy_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("查询记账子单元历史交易（NTDMTHLS）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "NTDMTHLS", bankSetDTO);
            if(result.isSuccess()){
                log.info("查询记账子单元历史交易（NTDMTLST）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    return Result.ok("查询成功！",object.getAsJsonObject("response").getAsJsonObject("body").getAsJsonArray("ntdmthlsz"));
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("查询记账子单元历史交易（NTDMTHLS）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

    /**
     * 查询记账子单元余额（NTDMABAL）
     *  单个
     * @param accnbr 账号
     * @param dmanbr 记账子单元编号
     * @return
     * @throws Exception
     */
    public static Result<?> querySubUnitBalance(String accnbr, String dmanbr, BankSetDTO bankSetDTO) {
        if(oConvertUtils.isEmpty(dmanbr)){
            return Result.error("记账子单元编号不能为空！");
        }
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "NTDMABAL");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray ntdmabalx_array = new JsonArray();
        JsonObject ntdmabalx = new JsonObject();
        ntdmabalx.addProperty("accnbr", accnbr);//账号
        ntdmabalx.addProperty("dmanbr", dmanbr);//记账子单元编号
        ntdmabalx_array.add(ntdmabalx);

        //body报文
        JsonObject body = new JsonObject();
        body.add("ntdmabalx", ntdmabalx_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("查询记账子单元余额（NTDMABAL）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "NTDMABAL", bankSetDTO);
            if(result.isSuccess()){
                log.info("查询记账子单元余额（NTDMABAL）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    JsonArray ntdmabalz = object.getAsJsonObject("response").getAsJsonObject("body").getAsJsonArray("ntdmabalz");
                    if(ntdmabalz!=null && ntdmabalz.size()>0){
                        return Result.ok("查询成功！",ntdmabalz.get(0).getAsJsonObject().get("actbal").getAsString());
                    }else {
                        return Result.ok("查询成功！","0.00");
                    }
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("查询记账子单元余额（NTDMABAL）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

    /**
     * 记账子单元内部转账（NTDMATRX）
     *
     * @param accnbr 账号
     * @param dmadbt 付款方记账子单元编号
     * @param dmacrt 收款方记账子单元编号
     * @param trxamt 转账金额
     * @param trxtxt 交易摘要
     * @return
     * @throws Exception
     */
    public static Result<?> doInternalTransfer(String accnbr, String dmadbt, String dmacrt, String trxamt, String trxtxt, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "NTDMATRX");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray ntdmatrxx1_array = new JsonArray();
        JsonObject ntdmatrxx1 = new JsonObject();
        ntdmatrxx1.addProperty("accnbr", accnbr);//账号
        ntdmatrxx1.addProperty("dmadbt", dmadbt);//付款方记账子单元编号
        ntdmatrxx1.addProperty("dmacrt", dmacrt);//收款方记账子单元编号
        ntdmatrxx1.addProperty("trxamt", trxamt);//转账金额
        ntdmatrxx1.addProperty("trxtxt", trxtxt);//交易摘要
        ntdmatrxx1_array.add(ntdmatrxx1);

        //body报文
        JsonObject body = new JsonObject();
        body.add("ntdmatrxx1", ntdmatrxx1_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("记账子单元内部转账（NTDMATRX）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "NTDMATRX", bankSetDTO);
            if(result.isSuccess()){
                log.info("记账子单元内部转账（NTDMATRX）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    JsonArray ntdmatrxz1 = object.getAsJsonObject("response").getAsJsonObject("body").getAsJsonArray("ntdmatrxz1");
                    return Result.ok("转账成功！",ntdmatrxz1);
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("记账子单元内部转账（NTDMATRX）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

//    /**
//     * 账户详细信息查询（NTQACINF）
//     *
//     * @param accnbr 账号
//     * @param bbknbr 分行号
//     * @return bankSetDTO
//     * @throws Exception
//     */
//    public static Result<?> queryAccountInfo(String accnbr, String bbknbr, BankSetDTO bankSetDTO) {
//        //请求头报文
//        JsonObject head = new JsonObject();
//        head.addProperty("funcode", "NTQACINF");
//        head.addProperty("userid", bankSetDTO.getZsyhUid());
//        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));
//
//        //接口请求参数
//        JsonArray ntqacinfx_array = new JsonArray();
//        JsonObject ntqacinfx = new JsonObject();
//        ntqacinfx.addProperty("accnbr", accnbr);//账号
//        ntqacinfx.addProperty("bbknbr", bbknbr);//分行号
//        ntqacinfx_array.add(ntqacinfx);
//
//        //body报文
//        JsonObject body = new JsonObject();
//        body.add("ntqacinfx", ntqacinfx_array);
//
//        //请求报文
//        JsonObject req = new JsonObject();
//        req.add("head", head);
//        req.add("body", body);
//
//        //最终请求报文
//        JsonObject obj = new JsonObject();
//        obj.add("request", req);
//        log.info("账户详细信息查询（NTQACINF）请求报文：{}", obj);
//        try {
//            // 请求发送接收
//            Result<?> result = SMRequest.doProcess(obj, "NTQACINF", bankSetDTO);
//            if(result.isSuccess()){
//                log.info("账户详细信息查询（NTQACINF）响应报文：{}", result.getResult());
//                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
//                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
//                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
//                    JsonArray ntqacinfz = object.getAsJsonObject("response").getAsJsonObject("body").getAsJsonArray("ntqacinfz");
//                    return Result.ok("查询成功！",ntqacinfz);
//                } else {
//                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
//                }
//            } else {
//                return Result.error(result.getMessage());
//            }
//        }catch (Exception e){
//            log.error("账户详细信息查询（NTQACINF）失败：{}", e.getMessage());
//            return Result.error("请求失败！");
//        }
//    }

//    /**
//     * 查询账户交易记录（DCTRSINF）
//     *  调用频率限制：该接口限制同一个账号间隔10S才能再次发起查询（续传除外）。
//     *  建议当天查询前一天的数据，每天查询一次即可。
//     * @param accnbr 账号
//     * @param bbknbr 分行号
//     * @param trsdat 交易日
//     * @param trsseq 起始记账序号(选填)
//     *               断点续传使用，以上一次查询返回的ntrbptrsz1接口中的记账序号，+1后填入本次查询，
//     *               首次查询填0或者为空，注意交易日切换后，记账序号又须从0起查。
//     *               该接口支持增量查询，客户需要记录上次返回报文的末位记账序号，继续查询该序号以后的交易，不用每次都从0开始查
//     * @return
//     * @throws Exception
//     */
//    public static Result<?> queryAccountTransaction(String accnbr, String bbknbr, String trsdat, String trsseq, BankSetDTO bankSetDTO) {
//        //请求头报文
//        JsonObject head = new JsonObject();
//        head.addProperty("funcode", "DCTRSINF");
//        head.addProperty("userid", bankSetDTO.getZsyhUid());
//        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));
//
//        //body报文
//        JsonObject body = new JsonObject();
//        body.addProperty("accnbr", accnbr);//账号
//        body.addProperty("bbknbr", bbknbr);//分行号
//        body.addProperty("trsdat", trsdat);//交易日
//        body.addProperty("trsseq", trsseq);//起始记账序号
//
//        //请求报文
//        JsonObject req = new JsonObject();
//        req.add("head", head);
//        req.add("body", body);
//
//        //最终请求报文
//        JsonObject obj = new JsonObject();
//        obj.add("request", req);
//        log.info("查询账户交易记录（DCTRSINF）请求报文：{}", obj);
//        try {
//            // 请求发送接收
//            Result<?> result = SMRequest.doProcess(obj, "DCTRSINF", bankSetDTO);
//            if(result.isSuccess()){
//                log.info("查询账户交易记录（DCTRSINF）响应报文：{}", result.getResult());
//                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
//                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
//                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
//                    return Result.ok("查询成功！",object.getAsJsonObject("response").getAsJsonObject("body"));
//                } else {
//                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
//                }
//            } else {
//                return Result.error(result.getMessage());
//            }
//        }catch (Exception e){
//            log.error("查询账户交易记录（DCTRSINF）失败：{}", e.getMessage());
//            return Result.error("请求失败！");
//        }
//    }

    /**
     * 代发经办（BB6BTHHL）
     * 下发金额（限制每次不超过1000笔）
     *
     * @param pushAccountModel
     * @param pullList
     * @return reqnbr：流程实例号
     * @return reqsta：请求状态：
     * OPR 数据接收中
     * AUT 等待审批
     * NTE 终审完毕
     * APW 银行人工审批
     * WRF 可疑
     * BNK 银行处理中
     * FIN 完成
     * @throws Exception
     */
    public static Result<?> doIssuedOnBehalf(PushAccountModel pushAccountModel,List<PullAccountModel> pullList, BankSetDTO bankSetDTO) {
        if (oConvertUtils.isEmpty(pushAccountModel)) {
            return Result.error("付款信息不能为空！");
        }
        if(oConvertUtils.listIsEmpty(pullList)){
            return Result.error("收款信息不能为空！");
        }else if(pullList.size() > 1000){
            return Result.error("单次代发不能超过1000笔！");
        }

        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "BB6BTHHL");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数1
        JsonArray bb6cdcdlx1_array = new JsonArray();
        for (PullAccountModel pullAccountModel : pullList) {
            JsonObject bb6cdcdlx1 = new JsonObject();
            bb6cdcdlx1.addProperty("trxseq", pullAccountModel.getCode());//交易序号：需要客户自行保证批次范围内的序号唯一性，代发代扣系统要求格式为全数字，如‘00000001’,’00000002’,不允许“00000000”每次最多接收1000笔明细
            bb6cdcdlx1.addProperty("accnbr", pullAccountModel.getBankCard());//收方账号
            bb6cdcdlx1.addProperty("accnam", pullAccountModel.getName());//收方户名
            bb6cdcdlx1.addProperty("trsamt", pullAccountModel.getMoney().toString());//交易金额
            bb6cdcdlx1_array.add(bb6cdcdlx1);
        }

        //接口请求参数2
        JsonArray bb6cdcbhx1_array = new JsonArray();
        JsonObject bb6cdcbhx1 = new JsonObject();
        bb6cdcbhx1.addProperty("begtag", "Y");//批次开始标志：首次传输Y，续传批次N
        bb6cdcbhx1.addProperty("endtag", "Y");//批次结束标志：结束批次Y，非结束批次N
        bb6cdcbhx1.addProperty("accnbr", pushAccountModel.getAccount());//付方账号
        bb6cdcbhx1.addProperty("accnam", pushAccountModel.getName());//付方户名
        bb6cdcbhx1.addProperty("ttlamt", pushAccountModel.getTotalAmount());//总金额：大于0，13位整数，2位小数
        bb6cdcbhx1.addProperty("curamt", pushAccountModel.getTotalAmount());//本次金额：大于0，13位整数，2位小数，总笔数少于1000笔，本次金额为总金额；总笔数大于1000笔，将会进行续传，本次金额为本批次总金额
        bb6cdcbhx1.addProperty("ttlcnt", pushAccountModel.getTotalNum());//总笔数
        bb6cdcbhx1.addProperty("ttlnum", "1");//总次数，没有超过1000笔总次数一次就够了
        bb6cdcbhx1.addProperty("curcnt", pushAccountModel.getTotalNum());//本次笔数：大于0 ，总笔数少于1000笔，本次笔数为总笔数；总笔数大于1000笔，将会进行续传，本次笔数按照1000笔进行分割
        bb6cdcbhx1.addProperty("ccynbr", "10");//币种：两位数字，默认币种赋值为10，例如：10-人民币
        bb6cdcbhx1.addProperty("ntfinf", "");//个性化短信
        bb6cdcbhx1.addProperty("trstyp", "BYBK");//交易类型：BYSA-代发工资 ，BYBK-代发其他
        bb6cdcbhx1.addProperty("nusage", "任务结算");//用途
        bb6cdcbhx1.addProperty("eptdat", pushAccountModel.getExpectDate());//期望日期：格式：YYYYMMDD
        bb6cdcbhx1.addProperty("epttim", "000000");//期望时间：HHMMSS,为空的话，默认值为000000
        bb6cdcbhx1.addProperty("yurref", pushAccountModel.getOrderNo());//业务参考号：允许数字或者字母，不允许中文业务参考号（YURREF）是每笔交易的唯一编号，是防止重复提交的重要手段，如需重复发送请求，请务必保证同一笔交易的业务参考号不变，否则会存在重复提交风险
        bb6cdcbhx1.addProperty("dmanbr", pushAccountModel.getSubUnit());//记账子单元
        bb6cdcbhx1.addProperty("chlflg", "Y");//结算通道：Y-超网，N-大小额
        bb6cdcbhx1_array.add(bb6cdcbhx1);

        //接口请求参数3
        JsonArray bb6busmod_array = new JsonArray();
        JsonObject bb6busmod = new JsonObject();
        bb6busmod.addProperty("buscod", "N03020");//业务类型：N03010-代发工资，N03020-代发其他
        bb6busmod.addProperty("busmod", "C0001");//业务模式：非空5位数字，例00001;网银设置--》银企直联--》接入设置--》业务模式信息
        bb6busmod_array.add(bb6busmod);

        //body报文
        JsonObject body = new JsonObject();
        body.add("bb6cdcdlx1", bb6cdcdlx1_array);
        body.add("bb6cdcbhx1", bb6cdcbhx1_array);
        body.add("bb6busmod", bb6busmod_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("代发经办（BB6BTHHL）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "BB6BTHHL", bankSetDTO);
            if(result.isSuccess()){
                log.info("代发经办（BB6BTHHL）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    JsonObject bb6cdcbhz1 = object.getAsJsonObject("response").getAsJsonObject("body")
                            .getAsJsonArray("bb6cdcbhz1").get(0).getAsJsonObject();
                    return Result.ok("代发成功！",bb6cdcbhz1);
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("代发（BB6BTHHL）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

    /**
     * 代发批次与明细查询（BB6BPDQY）
     *
     * @param yurref 业务参考号
     * @return 业务请求结果：rtnflg ：
     * S	成功
     * F	失败
     * C  撤销
     * D 过期 企业过期不审批
     * R 否决 企业审批否决
     * @return rsv100 : 第一位为P 表示部分成功
     * @throws Exception
     */
    public static Result<?> queryBatchAndDetail(String yurref, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "BB6BPDQY");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray bb6bpdqyy1_array = new JsonArray();
        JsonObject bb6bpdqyy1 = new JsonObject();
        bb6bpdqyy1.addProperty("buscod", "N03020");//业务编码
        bb6bpdqyy1.addProperty("yurref", yurref);//业务参考号
        bb6bpdqyy1_array.add(bb6bpdqyy1);

        //body报文
        JsonObject body = new JsonObject();
        body.add("bb6bpdqyy1", bb6bpdqyy1_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("代发批次与明细查询（BB6BPDQY）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "BB6BPDQY", bankSetDTO);
            if(result.isSuccess()){
                log.info("代发批次与明细查询（BB6BPDQY）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    return Result.ok("查询成功！",object.getAsJsonObject("response").getAsJsonObject("body"));
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("代发批次与明细查询（BB6BPDQY）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

//    /**
//     * 单笔回单查询（DCSIGREC）
//     *
//     * @param eacnbr 账号
//     * @param quedat 查询日期：2018-01-02
//     * @param trsseq 交易流水号
//     * @return
//     * @throws Exception
//     */
//    public static Result<?> querySingleReceipt(String eacnbr, String quedat, String trsseq, BankSetDTO bankSetDTO) {
//        //请求头报文
//        JsonObject head = new JsonObject();
//        head.addProperty("funcode", "DCSIGREC");
//        head.addProperty("userid", bankSetDTO.getZsyhUid());
//        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));
//
//        //body报文
//        JsonObject body = new JsonObject();
//        body.addProperty("eacnbr", eacnbr);//账号
//        body.addProperty("quedat", quedat);//查询日期
//        body.addProperty("trsseq", trsseq);//交易流水号
//
//        //请求报文
//        JsonObject req = new JsonObject();
//        req.add("head", head);
//        req.add("body", body);
//
//        //最终请求报文
//        JsonObject obj = new JsonObject();
//        obj.add("request", req);
//        log.info("单笔回单查询（DCSIGREC）请求报文：{}", obj);
//        try {
//            //请求发送接收
//            Result<?> result = SMRequest.doProcess(obj, "DCSIGREC", bankSetDTO);
//            if(result.isSuccess()){
//                log.info("单笔回单查询（DCSIGREC）响应报文：{}", result.getResult());
//                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
//                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
//                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
//                    //单笔回单返回的数据流
//                    String fildat = object.getAsJsonObject("response").getAsJsonObject("body").get("fildat").getAsString();
//                    // 解码
////                byte[] decodeBytes = Base64.getDecoder().decode(fildat);
////                InputStream inputStream = new ByteArrayInputStream(decodeBytes);
//                    return Result.ok("查询成功！",fildat);
//                }else {
//                    return Result.error("查询失败！");
//                }
//            } else {
//                return Result.error(result.getMessage());
//            }
//        }catch (Exception e){
//            log.error("单笔回单查询（DCSIGREC）失败：{}", e.getMessage());
//            return Result.error("请求失败！");
//        }
//    }

//    /**
//     * 方法功能：将字节数组写入到新建文件中。
//     * @param fname
//     * @param msg
//     * @return boolean
//     * */
//    public static boolean save2File(String fname, byte[] msg){
//        OutputStream fos = null;
//        try{
//            File file = new File(fname);
//            File parent = file.getParentFile();
//            boolean bool;
//            if ((!parent.exists()) &&
//                    (!parent.mkdirs())) {
//                return false;
//            }
//            fos = new FileOutputStream(file);
//            fos.write(msg);
//            fos.flush();
//            return true;
//        }catch (FileNotFoundException e){
//            return false;
//        }catch (IOException e){
//            File parent;
//            return false;
//        }
//        finally{
//            if (fos != null) {
//                try{
//                    fos.close();
//                }catch (IOException e) {}
//            }
//        }
//    }

//    /**
//     * 电子回单异步查询（ASYCALHD）
//     *  建议每天查前一天的数据，不要重复多次调用。
//     * @param eacnbr 账号
//     * @param begdat 起始日期：yyyy-MM-dd格式
//     * @param enddat 结束日期：yyyy-MM-dd格式
//     * @return  rtndat 打印任务编号
//     * @throws Exception
//     */
//    public static Result<?> queryElectronicReceiptAsyn(String eacnbr, String begdat, String enddat, BankSetDTO bankSetDTO) {
//        //请求头报文
//        JsonObject head = new JsonObject();
//        head.addProperty("funcode", "ASYCALHD");
//        head.addProperty("userid", bankSetDTO.getZsyhUid());
//        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));
//
//        //body报文
//        JsonObject body = new JsonObject();
//        body.addProperty("eacnbr", eacnbr);//账号
//        body.addProperty("begdat", begdat);//起始日期
//        body.addProperty("enddat", enddat);//结束日期
//        body.addProperty("rrcflg", "1");//打印标志：1:未打印 2:已打印
//        body.addProperty("primod", "PDF");//文件格式
//
//        //请求报文
//        JsonObject req = new JsonObject();
//        req.add("head", head);
//        req.add("body", body);
//
//        //最终请求报文
//        JsonObject obj = new JsonObject();
//        obj.add("request", req);
//        log.info("电子回单异步查询（ASYCALHD）请求报文：{}", obj);
//        try {
//            //请求发送接收
//            Result<?> result = SMRequest.doProcess(obj, "ASYCALHD", bankSetDTO);
//            if(result.isSuccess()){
//                log.info("电子回单异步查询（ASYCALHD）响应报文：{}", result.getResult());
//                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
//                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
//                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
//                    return Result.ok("查询成功！",object.getAsJsonObject("response").getAsJsonObject("body").getAsJsonObject("asycalhdz1").get("rtndat").getAsString());
//                }else {
//                    return Result.error("查询失败！");
//                }
//            } else {
//                return Result.error(result.getMessage());
//            }
//        }catch (Exception e){
//            log.error("电子回单异步查询（ASYCALHD）失败：{}", e.getMessage());
//            return Result.error("请求失败！");
//        }
//    }

//    /**
//     * 异步打印结果查询（DCTASKID）
//     *
//     * @param taskid 任务id
//     * @return 如果查询返回错误码为：PRTASYNC时，请继续用当前ID来查处理结果；
//     *  如果出现其他报错，请重新发起查询请求（ASYCALHD）获取新的查询ID，不要重复查询报错的ID
//     *      fileurl 文件url（该链接有效期1天）
//     * @throws Exception
//     */
//    public static Result<?> queryPrintResultsAsyn(String taskid, BankSetDTO bankSetDTO) {
//        //请求头报文
//        JsonObject head = new JsonObject();
//        head.addProperty("funcode", "DCTASKID");
//        head.addProperty("userid", bankSetDTO.getZsyhUid());
//        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));
//
//        //body报文
//        JsonObject body = new JsonObject();
//        body.addProperty("taskid", taskid);//任务id
//
//        //请求报文
//        JsonObject req = new JsonObject();
//        req.add("head", head);
//        req.add("body", body);
//
//        //最终请求报文
//        JsonObject obj = new JsonObject();
//        obj.add("request", req);
//        log.info("异步打印结果查询（DCTASKID）请求报文：{}", obj);
//        try {
//            //请求发送接收
//            Result<?> result = SMRequest.doProcess(obj, "DCTASKID", bankSetDTO);
//            if(result.isSuccess()){
//                log.info("异步打印结果查询（DCTASKID）响应报文：{}", result.getResult());
//                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
//                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
//                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
//                    return Result.ok("查询成功！",object.getAsJsonObject("response").getAsJsonObject("body").get("fileurl").getAsString());
//                }else {
//                    return Result.error("查询失败！");
//                }
//            } else {
//                return Result.error(result.getMessage());
//            }
//        }catch (Exception e){
//            log.error("异步打印结果查询（DCTASKID）失败：{}", e.getMessage());
//            return Result.error("请求失败！");
//        }
//    }

    /**
     * 企银支付单笔经办（BB1PAYOP）
     * @param dbtAcc 转出帐号
     * @param dmaNbr 记账子单元编号
     * @param crtAcc 收方帐号
     * @param crtNam 收方户名
     * @param crtBnk 收方开户银行
     * @param brdNbr 收方行联行号
     * @param trsAmt 交易金额
     * @param nusAge 用途
         * @param yurRef 业务参考号
     * @param bankSetDTO
     * @return
     */
    public static Result<?> doPaymentSingle(String dbtAcc,String dmaNbr, String crtAcc, String crtNam, String crtBnk, String brdNbr,
                                            double trsAmt, String nusAge, String yurRef, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "BB1PAYOP");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray bb1paybmx1_array = new JsonArray();
        JsonObject bb1paybmx1 = new JsonObject();
        bb1paybmx1.addProperty("busMod", "C0001");//业务模式（模式编号）-支付（无审批）
        bb1paybmx1.addProperty("busCod", "N02030");//业务类型（业务代码）
        bb1paybmx1_array.add(bb1paybmx1);

        String bnkFlg = "N";//系统内标志：收方为招行户：传空或Y；收方为他行户：传N；
        if (crtBnk.contains("招商银行")) bnkFlg = "Y";
        JsonArray bb1payopx1_array = new JsonArray();
        JsonObject bb1payopx1 = new JsonObject();
        bb1payopx1.addProperty("dbtAcc", dbtAcc);//转出帐号
        bb1payopx1.addProperty("dmaNbr", dmaNbr);//记账子单元编号
        bb1payopx1.addProperty("crtAcc", crtAcc);//收方帐号
        bb1payopx1.addProperty("crtNam", crtNam);//收方户名
        bb1payopx1.addProperty("crtBnk", crtBnk);//收方开户行名称（收款银行开户支行）
        bb1payopx1.addProperty("brdNbr", brdNbr);//收方行联行号
        bb1payopx1.addProperty("ccyNbr", "10" );//币种（只支持10人民币）
        bb1payopx1.addProperty("trsAmt", trsAmt );//交易金额
        bb1payopx1.addProperty("bnkFlg", bnkFlg);//系统内标志：收方为招行户：传空或Y；收方为他行户：传N；
        bb1payopx1.addProperty("stlChn", "R" );//结算通道：G-普通，Q-快速，R-实时-超网，I-智能路由。输入空时默认为Q快速;
        bb1payopx1.addProperty("nusAge", nusAge );//用途
        bb1payopx1.addProperty("yurRef", yurRef );//业务参考号
        bb1payopx1_array.add(bb1payopx1);

        //body报文
        JsonObject body = new JsonObject();
        body.add("bb1paybmx1", bb1paybmx1_array);
        body.add("bb1payopx1", bb1payopx1_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("企银支付单笔经办（BB1PAYOP）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "BB1PAYOP", bankSetDTO);
            if(result.isSuccess()){
                log.info("企银支付单笔经办（BB1PAYOP）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    JsonObject bb1payopz1 = object.getAsJsonObject("response").getAsJsonObject("body")
                            .getAsJsonArray("bb1payopz1").get(0).getAsJsonObject();
                    return Result.ok("支付成功！",bb1payopz1);
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("企银支付单笔经办（BB1PAYOP）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

    /**
     * 企银支付业务查询（BB1PAYQR）
     * @param yurRef
     * @param bankSetDTO
     * @return
     */
    public static Result<?> queryPaymentSingle(String yurRef, BankSetDTO bankSetDTO) {
        //请求头报文
        JsonObject head = new JsonObject();
        head.addProperty("funcode", "BB1PAYQR");
        head.addProperty("userid", bankSetDTO.getZsyhUid());
        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));

        //接口请求参数
        JsonArray bb1payqrx1_array = new JsonArray();
        JsonObject bb1payqrx1 = new JsonObject();
        bb1payqrx1.addProperty("busCod", "N02030");//业务类型（业务代码）
        bb1payqrx1.addProperty("yurRef", yurRef);//业务参考号
        bb1payqrx1_array.add(bb1payqrx1);

        //body报文
        JsonObject body = new JsonObject();
        body.add("bb1payqrx1", bb1payqrx1_array);

        //请求报文
        JsonObject req = new JsonObject();
        req.add("head", head);
        req.add("body", body);

        //最终请求报文
        JsonObject obj = new JsonObject();
        obj.add("request", req);
        log.info("企银支付业务查询（BB1PAYQR）请求报文：{}", obj);
        try {
            // 请求发送接收
            Result<?> result = SMRequest.doProcess(obj, "BB1PAYQR", bankSetDTO);
            if(result.isSuccess()){
                log.info("企银支付业务查询（BB1PAYQR）响应报文：{}", result.getResult());
                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
                    JsonArray bb1payqrz1 = object.getAsJsonObject("response").getAsJsonObject("body").getAsJsonArray("bb1payqrz1");
                    return Result.ok("查询成功！",bb1payqrz1);
                } else {
                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
                }
            } else {
                return Result.error(result.getMessage());
            }
        }catch (Exception e){
            log.error("企银支付业务查询（BB1PAYQR）失败：{}", e.getMessage());
            return Result.error("请求失败！");
        }
    }

//    /**
//     * 联行号查询（DCQRYNUM）
//     * @param whlnam
//     * @param bankSetDTO
//     * @return
//     */
//    public static Result<?> queryInterbankNumber(String whlnam, BankSetDTO bankSetDTO) {
//        //请求头报文
//        JsonObject head = new JsonObject();
//        head.addProperty("funcode", "DCQRYNUM");
//        head.addProperty("userid", bankSetDTO.getZsyhUid());
//        head.addProperty("reqid", DCHelper.getTime() + GENKey.genRandomString(new Random(), "0123456789", 6));
//
//        //接口请求参数
//        JsonObject dcqrynumy = new JsonObject();
//        dcqrynumy.addProperty("whlnam", whlnam);//银行名称
//
//        //body报文
//        JsonObject body = new JsonObject();
//        body.add("dcqrynumy", dcqrynumy);
//
//        //请求报文
//        JsonObject req = new JsonObject();
//        req.add("head", head);
//        req.add("body", body);
//
//        //最终请求报文
//        JsonObject obj = new JsonObject();
//        obj.add("request", req);
//        log.info("联行号查询（DCQRYNUM）请求报文：{}", obj);
//        try {
//            // 请求发送接收
//            Result<?> result = SMRequest.doProcess(obj, "DCQRYNUM", bankSetDTO);
//            if(result.isSuccess()){
//                log.info("联行号查询（DCQRYNUM）响应报文：{}", result.getResult());
//                JsonObject object = new GsonBuilder().create().fromJson(result.getResult().toString(), JsonObject.class);
//                String resultcode = object.getAsJsonObject("response").getAsJsonObject("head").get("resultcode").getAsString();
//                if(CMBConstant.SUCCESS_CODE.equals(resultcode)){//返回成功
//                    JsonArray dcqrynumz = object.getAsJsonObject("response").getAsJsonObject("body").getAsJsonArray("dcqrynumz");
//                    return Result.ok("查询成功！",dcqrynumz);
//                } else {
//                    return Result.error(object.getAsJsonObject("response").getAsJsonObject("head").get("resultmsg").getAsString());
//                }
//            } else {
//                return Result.error(result.getMessage());
//            }
//        }catch (Exception e){
//            log.error("联行号查询（DCQRYNUM）失败：{}", e.getMessage());
//            return Result.error("请求失败！");
//        }
//    }

}
